﻿namespace PropOnline.ViewModels.Propiedad
{
    using System;
    using System.Collections.Generic;
    using System.Globalization;
    using System.Linq;
    using System.Text;
    using System.Web;
    using PropOnline.Helpers;
    using PropOnline.Models;
    using PropOnline.Properties;

    public class PropiedadDetallesViewModel
    {
        private string inmobiliaria;

        private string imagenUrl;

        private string barrio;

        public uint Id { get; set; }

        public TipoPropiedad? TipoPropiedad { get; set; }

        public string TipoPropiedadString
        {
            get
            {
                StringBuilder sb = new StringBuilder();
                sb.Append(EnumExtensions.GetDescription(typeof(TipoPropiedad), this.TipoPropiedad));
                sb.Append(" en " + this.Operacion);

                if (!string.IsNullOrEmpty(this.Zona))
                {
                    sb.Append(" en " + this.Zona);
                }

                return sb.ToString();
            }
        }

        public Operacion Operacion { get; set; }

        public string Calle { get; set; }

        public string Direccion
        {
            get
            {
                StringBuilder builder = new StringBuilder();

                if (!string.IsNullOrEmpty(this.Calle))
                {
                    builder.Append(CultureInfo.CurrentCulture.TextInfo.ToTitleCase(this.Calle.ToLower(CultureInfo.CurrentCulture)));
                    if (this.Altura > 0)
                    {
                        builder.Append(" " + this.Altura.ToString(CultureInfo.CurrentCulture));
                    }
                    else if (!string.IsNullOrEmpty(this.Interseccion))
                    {
                        builder.Append(" y " + CultureInfo.CurrentCulture.TextInfo.ToTitleCase(this.Interseccion.ToLower(CultureInfo.CurrentCulture)));
                    }

                    if (!string.IsNullOrEmpty(this.Piso))
                    {
                        builder.Append(" Piso: " + this.Piso);
                    }

                    if (!string.IsNullOrEmpty(this.Departamento))
                    {
                        builder.Append(" Dpto: " + this.Departamento);
                    }
                }
                else
                {
                    builder.Append(Resources.NoEspecificada);
                }

                return builder.ToString();
            }
        }

        public string Interseccion { get; set; }

        public string Zona { get; set; }

        public string Barrio
        {
            get
            {
                if (!string.IsNullOrEmpty(this.barrio))
                {
                    return this.barrio;
                }
                else
                {
                    return Resources.NoEspecificado;
                }
            }

            set
            {
                this.barrio = value;
            }
        }

        public AvisoDetallesViewModel UltimoAviso { get; set; }

        public uint Altura { get; set; }

        public string Piso { get; set; }

        public string Departamento { get; set; }

        public uint Ambientes { get; set; }

        public string AmbientesString
        {
            get
            {
                if (this.Ambientes > 0)
                {
                    StringBuilder sb = new StringBuilder();
                    sb.Append(this.Ambientes);
                    if (this.Dependencia)
                    {
                        sb.Append(" " + Properties.Resources.ConDependencia);
                    }

                    return sb.ToString();
                }

                return Properties.Resources.NoEspecificados;
            }
        }

        public bool Dependencia { get; set; }

        public short? Superficie { get; set; }

        public string SuperficieString
        {
            get
            {
                if (this.Superficie > 0)
                {
                    return String.Format("{0} m2", this.Superficie, CultureInfo.CurrentCulture);
                }

                return Properties.Resources.NoEspecificada;
            }
        }

        public IEnumerable<CaracteristicaPropiedad> Caracteristicas { get; set; }

        public string Zonificacion
        {
            get
            {
                CaracteristicaPropiedad caracteristica = this.Caracteristicas
                    .Where(c => c.Nombre == "Zonificacion")
                    .FirstOrDefault();

                return caracteristica != null ? caracteristica.Valor : string.Empty;
            }
        }

        public string Latitud { get; set; }

        public string Longitud { get; set; }

        public bool HasImagen
        {
            get
            {
                return !string.IsNullOrEmpty(this.imagenUrl);
            }
        }

        public string ImagenUrl
        {
            get
            {
                return this.imagenUrl == null ? VirtualPathUtility.ToAbsolute(PropOnlineConstants.PropiedadSinFotoUrl) : this.imagenUrl;
            }

            set
            {
                this.imagenUrl = value;
            }
        }

        public uint? Telefono { get; set; }

        public string TelefonoString
        {
            get
            {
                if (this.Telefono > 0)
                {
                    return " - " + PropiedadHelper.FormatTelefono(this.Telefono);
                }

                return string.Empty;
            }
        }

        public string Inmobiliaria
        {
            get
            {
                if (!string.IsNullOrEmpty(this.inmobiliaria))
                {
                    return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(this.inmobiliaria.ToLower(CultureInfo.CurrentCulture));
                }

                return Properties.Resources.NoEspecificada;
            }

            set
            {
                this.inmobiliaria = value;
            }
        }

        public DateTime FechaPrimeraPub { get; set; }

        public string TiempoEnMercado
        {
            get
            {
                return PropiedadHelper.ObtenerTiempoEnMercado(this.FechaPrimeraPub);
            }
        }

        public uint? Precio { get; set; }

        public string PrecioString
        {
            get
            {
                if (this.Precio > 0)
                {
                    var precio = this.Precio.Value.ToString("N0", CultureInfo.CurrentCulture);
                    var moneda = EnumExtensions.GetDescription(typeof(Moneda), this.Moneda);

                    return String.Format("{0} {1}", moneda, precio, CultureInfo.CurrentCulture);
                }

                return Properties.Resources.NoEspecificado;
            }
        }

        public Moneda? Moneda { get; set; }
    }
}